#Read files by char
my ($data, $n, $offset);
while (($n = read FILE, $data, 4, $offset) != 0) {
  print "$n bytes read\n";
  $offset += $n;
}

#Simple parser
 $_ = "What did he say?";
  my @sentence;
  until (/\G$/gc) { # until pos at end of string
    if (/\G([A-Za-z']+)/gc) {
      push @sentence, [word => $1];
    } elsif (/\G([,.?!])/gc) {
      push @sentence, [punct => $1];
    } elsif (/\G\s+/gc) {
      # ignore whitespace
    } else {
      die "I cannot parse the remainder of ", /\G(.*)/gc;
    }
  }
  #Result:
       # my @sentence = (
       # [word => "What"],
       # [word => "did"],
       # [word => "he"],
       # [word => "say"],
       # [punct => "?"],
     # );






	 
# This file documents Tie::File version 0.96
use Tie::File;

tie @array, 'Tie::File', filename or die ...;

$array[13] = 'blah';     # line 13 of the file is now 'blah'
print $array[42];        # display line 42 of the file

$n_recs = @array;        # how many records are in the file?
$#array -= 2;            # chop two records off the end


for (@array) {
  s/PERL/Perl/g;         # Replace PERL with Perl everywhere in the file
}

# These are just like regular push, pop, unshift, shift, and splice
# Except that they modify the file in the way you would expect

push @array, new recs...;
my $r1 = pop @array;
unshift @array, new recs...;
my $r2 = shift @array;
@old_recs = splice @array, 3, 7, new recs...;

untie @array;            # all finished


#Regexes to Parse Lexicon / Trees
use Regexp::Common qw /balanced/;

    while (<>) {
        /$RE{balanced}{-parens=>'()'}/
                                   and print q{balanced parentheses\n};
    }
qr/$RE{balanced}{-begin => "do|if|case"}{-end => "done|fi|esac"}/


		
#!/usr/bin/perl
 
use Tie::File;
 
#-- modify all ocurrences of 'HowTo' to 'how to'
tie @lines, 'Tie::File', "readme.txt" or die "Can't read file: $!\n";
foreach ( @lines )
{
  s/HowTo/how to/g;
}
untie @lines;